﻿using DAL.Interfases;
using Entidad;
using Npgsql;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Text;
using Dapper;
using DapperExtensions;

namespace DAL.Repositories
{
    public interface IPendienteEntregaRepository : IRepository<OrdenCompraPendiente>
    {
        IList<OrdenCompraPendiente> FindAllWithOrdenProductoProveedorSucursal(int proveedor_id);
    }

    public class PendienteEntregaRepository : IPendienteEntregaRepository
    {

        readonly NpgsqlConnection _cnn;

        public PendienteEntregaRepository()
        {
            _cnn = new NpgsqlConnection(ConfigurationManager.ConnectionStrings["RWORLD"].ToString());
        }

        public IList<OrdenCompraPendiente> FindAll()
        {
            using (IDbConnection _db = new NpgsqlConnection(ConfigurationManager.ConnectionStrings["RWORLD"].ToString()))
            {
                return _db.Query<OrdenCompraPendiente>("SELECT * FROM ORDENCOMPRAPENDIENTE ORDER BY ODCID DESC").ToList();
            }
        }

        public IQueryable<OrdenCompraPendiente> Find(System.Linq.Expressions.Expression<Func<OrdenCompraPendiente, bool>> predicate)
        {
            throw new NotImplementedException();
        }

        public OrdenCompraPendiente FindById(int id)
        {
            throw new NotImplementedException();
        }

        public int add(OrdenCompraPendiente newEntity)
        {
            throw new NotImplementedException();
        }

        public bool remove(int id)
        {
            throw new NotImplementedException();
        }

        public int Modify(OrdenCompraPendiente entity)
        {
            throw new NotImplementedException();
        }

        public IList<OrdenCompraPendiente> FindAllWithOrdenProductoProveedorSucursal(int proveedor_id)
        {
            string query = "SELECT * FROM ORDENCOMPRAPENDIENTE " +
                "INNER JOIN ORDENCOMPRA ON ORDENCOMPRA.ODCID = ORDENCOMPRAPENDIENTE.ODCID " +
                "INNER JOIN PRODUCTO ON PRODUCTO.PRDID = ORDENCOMPRAPENDIENTE.PRDID " +
                "INNER JOIN PROVEEDOR ON PROVEEDOR.PROID = ORDENCOMPRAPENDIENTE.PROID " +
                "INNER JOIN SUCURSAL ON SUCURSAL.SUCID = ORDENCOMPRAPENDIENTE.SUCID " +
                "WHERE ORDENCOMPRAPENDIENTE.OCDCANTIDAD > 0 AND ORDENCOMPRA.PROID = "+ proveedor_id +
                "ORDER BY ORDENCOMPRA.ODCFECHA DESC";

            using (IDbConnection _db = new NpgsqlConnection(ConfigurationManager.ConnectionStrings["RWORLD"].ToString()))
            {
                return _db.Query<OrdenCompraPendiente, OrdenCompra, Producto, Proveedor, Sucursal, OrdenCompraPendiente>(query,
                    (pendiente, orden, producto, proveedor, sucursal) =>
                    {
                        pendiente.ordencompra = orden; 
                        pendiente.producto = producto; 
                        pendiente.proveedor = proveedor; 
                        pendiente.sucursal = sucursal; 
                        return pendiente;
                    }, splitOn:"odcid, prdid, proid, sucid").ToList();
            }
        }
    }
}
